package cn.funeralobjects.upms.service;

import cn.funeralobjects.common.service.CommonCloudService;
import cn.funeralobjects.common.service.CommonTreeCrudService;
import cn.funeralobjects.upms.BasicInfo;
import cn.funeralobjects.upms.entity.EGroup;
import cn.funeralobjects.upms.model.Group;
import cn.funeralobjects.util.NumberUtils;

import java.util.List;

/**
 * 用户组的业务接口
 *
 * @author FuneralObjects
 * Create date: 2019-08-15 10:32
 */
public interface GroupService extends CommonCloudService<EGroup, Integer>, CommonTreeCrudService<Group, EGroup, Integer> {
    String ENTITY_NAME = "GROUP";

    /**
     * 顶级、根
     */
    Integer ROOT_ID = 0;

    /**
     * 判断是否为最高级的父级id
     *
     * @param parentId 父级ID
     * @return true - 是
     */
    static boolean isRootParentId(Integer parentId) {
        return ROOT_ID.equals(parentId);
    }

    /**
     * 添加组标签
     *
     * @param groupId 组id
     * @param tag     标签
     */
    void addGroupTag(Integer groupId, String tag);

    /**
     * 删除组标签
     *
     * @param groupId 组id
     * @param tag     标签
     */
    void removeGroupTag(Integer groupId, String tag);

    /**
     * 获取组标签
     *
     * @param groupId 组id
     * @return 组标签
     */
    List<String> getTags(Integer groupId);

    /**
     * 查询组id
     *
     * @param tag 标签
     * @return 组id集合
     */
    List<Integer> findGroupIdByTag(String tag);

    /**
     * 组名不能冲突
     *
     * @param name 组名
     */
    void notConflict(String name);

    /**
     * 组名不能冲突
     *
     * @param name      名称
     * @param withoutId 被排除的id
     */
    void notConflict(String name, Integer withoutId);

    /**
     * 查询组的所属路径
     *
     * @param id 组id
     * @return 路径数组
     */
    List<Integer> getPathById(Integer id);

    /**
     * 获取实体名
     *
     * @return 实体名
     */
    @Override
    default String getName() {
        return ENTITY_NAME;
    }

    /**
     * 获得所在模块名
     *
     * @return 模块名
     */
    @Override
    default String getModuleName() {
        return BasicInfo.MODULE;
    }

    /**
     * 判断是否有效
     *
     * @param id id
     * @return true - 有效
     */
    @Override
    default boolean isValid(Integer id) {
        return NumberUtils.notZero(id);
    }

}
